package controller;

import business.EmprestimoBO;
import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import business.EmprestimoException;
import dao.EmpregadoDAO;
import dao.EmprestimoDAO;
import java.util.List;
import model.Empregado;
import model.Emprestimo;


public class EmprestimoServlet extends BaseServlet {
	
    public EmprestimoServlet() {
        super();
    }

    /**
     * Método executado antes de apresentar a tela de solicitação de empréstimo.
     * 
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void antesSolicitar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher rd = null;

        try {
            rd = request.getRequestDispatcher("solicitar.jsp");
        }
        catch (Exception e) {
            request.setAttribute("mensagem", "Erro na ação anterior a solicitação de empréstimo.");
            request.setAttribute("detalhe", e.getMessage());
            rd = request.getRequestDispatcher("../erro.jsp");
        }
        finally {
            rd.forward(request, response);
        }

    }

    /**
     * Método executado ao submeter o formulário da tela de solicitação do empréstimo.
     * 
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void solicitar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher rd = null;
        String mensagem = null;
        String mensagemErro = null;

        try {

            Empregado empregado = new Empregado();
            empregado.setCpf(request.getParameter("cpfEmpregado"));

            Emprestimo emprestimoTemporario = new Emprestimo();
            emprestimoTemporario.setEmpregado(empregado);
            emprestimoTemporario.setValorEmprestimo(request.getParameter("valorEmprestimo"));
            emprestimoTemporario.setNumPrestacoes(request.getParameter("numPrestacoes"));

            try {
                Emprestimo emprestimo = EmprestimoBO.getInstance().solicitaEmprestimo(emprestimoTemporario);
                request.setAttribute("emprestimo", emprestimo);
                rd = request.getRequestDispatcher("info.jsp");
            }
            catch (EmprestimoException e) {
                mensagemErro = e.getMessage();
                request.setAttribute("mensagemErro", mensagemErro);
                rd = request.getRequestDispatcher("solicitar.jsp");
            }

        } 
        catch (Exception e) {
                request.setAttribute("mensagem", "Erro na ação de solicitar empréstimo.");
                request.setAttribute("detalhe", e.getMessage());
                rd = request.getRequestDispatcher("../erro.jsp");
        }
        finally {
            rd.forward(request, response);
        }

    }

    /**
     * Método executado ao confirmar a solicitação de um empréstimo.
     * 
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void confirmar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher rd = null;
        String mensagem = null;

        try {

            String cpf = request.getParameter("cpf");
            Empregado empregado = EmpregadoDAO.getInstance().consultaEmpregadoPorCpf(cpf);

            Emprestimo emprestimo = new Emprestimo();
            emprestimo.setEmpregado(empregado);
            emprestimo.setValorEmprestimo(request.getParameter("valorEmprestimo"));
            emprestimo.setNumPrestacoes(request.getParameter("numPrestacoes"));
            emprestimo.setValorTotal(request.getParameter("valorTotal"));
            emprestimo.setValorPrestacao(request.getParameter("valorPrestacao"));

            EmprestimoBO.getInstance().confirmaEmprestimo(emprestimo);
            request.setAttribute("emprestimo", emprestimo);

            mensagem = "Empréstimo realizado com sucesso!";
            request.setAttribute("mensagem", mensagem);

            rd = request.getRequestDispatcher("info.jsp");

        } 
        catch (Exception e) {
            request.setAttribute("mensagem", "Erro na ação de confirmar empréstimos.");
            request.setAttribute("detalhe", e.getMessage());
            rd = request.getRequestDispatcher("../erro.jsp");
        } 
        finally {
            rd.forward(request, response);
        }

    }

    /**
     * Método executado para listar o histórico de empréstimos.
     * 
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void listar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher rd = null;
        String mensagemErro = null;

        try {

            List<Emprestimo> listaEmprestimos = EmprestimoDAO.getInstance().listar();
            request.setAttribute("listaEmprestimos", listaEmprestimos);

            if (listaEmprestimos.isEmpty()) {
                mensagemErro = "Nenhum empréstimo cadastrado.";
                request.setAttribute("mensagemErro", mensagemErro);
            }

            rd = request.getRequestDispatcher("listar.jsp");

        } 
        catch (Exception e) {
            request.setAttribute("mensagem", "Erro na ação de listar empréstimos.");
            request.setAttribute("detalhe", e.getMessage());
            rd = request.getRequestDispatcher("../erro.jsp");
        }
        finally {
            rd.forward(request, response);
        }

    }
    
}
